package com.xrit.sunnyday.service.impl;

import com.alibaba.dubbo.common.utils.StringUtils;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xrit.sunnyday.common.utils.QiNiuUtils;
import com.xrit.sunnyday.dao.SetMealMapper;
import com.xrit.sunnyday.pojo.Setmeal;
import com.xrit.sunnyday.service.SetMealService;
import com.xrit.sunnyday.common.MessageConstant;
import com.xrit.sunnyday.common.PageResult;
import com.xrit.sunnyday.common.QueryPageBean;
import com.xrit.sunnyday.common.SunnydayException;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfig;

import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service(interfaceClass = SetMealService.class)
public class SetMealServiceImpl implements SetMealService {
    @Autowired
    private SetMealMapper setMealMapper;
    @Override
    public PageResult findPageAll(QueryPageBean queryPageBean) {
        //判断是否有查询条件
        if(!StringUtils.isEmpty(queryPageBean.getQueryString())){
            queryPageBean.setQueryString("%"+queryPageBean.getQueryString()+"%");
        }
        //开启分页插件(将当前页和每页显示条数给它)
        PageHelper.startPage(queryPageBean.getCurrentPage(),queryPageBean.getPageSize());
        //调用查询方法
        List<Setmeal> pageAll = setMealMapper.findPageAll(queryPageBean.getQueryString());
        //创建paginfo(将查询结果放入pageinfo就能帮我们计算分页信息)
        PageInfo<Setmeal> pageInfo = new PageInfo<>(pageAll);
        //将处理好的结果放回
        return  new PageResult(pageInfo.getTotal(),pageInfo.getList());
    }

    @Override
    public void deleteById(Integer id) throws SunnydayException {
        //1,调用根据套餐id查询订单表中是否有该套餐
        int setMealOrdercount = setMealMapper.findSetMealOrderById(id);
        //2,判断是否有关系,>0有则不能删除
        if(setMealOrdercount>0){
            throw new SunnydayException(MessageConstant.DELETE_SETMEAL_ERROR);
        }
        //3,调用根据套餐id查询套餐和检查组中间表
        int setMealCheckGroupcount = setMealMapper.findSetMealCheckGroupById(id);
        //4,判断是否有关系(>0有则删除套餐和检查组中对应的检查组)
        if(setMealCheckGroupcount>0){
            setMealMapper.deleteSetMealCheckGroupById(id);
        }
        //5,删除套餐
        setMealMapper.deleteById(id);
    }

    @Override
    @Transactional
    public void add(Integer[] checkgroupIds, Setmeal setmeal) {
        //调用添加到套餐的方法
        setMealMapper.add(setmeal);
        //循环遍历检查组id
        for (Integer checkgroupId : checkgroupIds) {
            //调用添加到套餐和检查组中间表的方法(通过配置文件中的selectkey拿到最后一次添加的套餐id)
            setMealMapper.addSetMealCheckGroup(setmeal.getId(),checkgroupId);
        }
        //调用套餐页面生成的方法
        SetMealHtmlGenerate();
    }
    /*
    套餐页面生成方法
     */
    public void SetMealHtmlGenerate(){
       SetMealListHtmlGenerate();
       SetMealDetailsHtmlGenerate();
    }
    //处理一个套餐列表的静态页面生成的方法
    public void SetMealListHtmlGenerate(){
        //2,设置模板文件
        String template = "mobile_setmeal.ftl";
        //3,调用查询套餐数据的方法
        List<Setmeal> setmealList = setMealMapper.findAll();
        //3.2 循环遍历数据 为了给图片拼接七牛云域名
        for (Setmeal setmeal : setmealList) {
            setmeal.setImg(QiNiuUtils.DOMAIN+setmeal.getImg());
        }
        //4,创建装载数据的集合
        HashMap<String, Object> map = new HashMap<>();
        //4.2 添加数据
        map.put("setmealList",setmealList);
        //5,设置静态页面生成位置和页面名称
        String outPutPathName=out_put_path+"mobile_setmeal.html";
        //1,调用静态化页面的方法(我们可以看到他需要三个参数)
       HtmlStatic(template,map,outPutPathName);
    }
    //处理多个套餐列表静态页面生成的方法
    public void SetMealDetailsHtmlGenerate(){
        //2,设置模板
        String templateName="mobile_setmeal_detail.ftl";
        //3,调用查询所有套餐数据
        List<Setmeal> setmealList = setMealMapper.findAll();
        //3.2 遍历套餐集合 为了获取套餐id
        for (Setmeal setmeal : setmealList) {
            Integer setmealId = setmeal.getId();
            //3.3调用根据id查询套餐详情的方法
            Setmeal setmealInDb = setMealMapper.findDetailById(setmealId);
            //3.4给图片拼接七牛云域名
            setmealInDb.setImg(QiNiuUtils.DOMAIN+setmealInDb.getImg());

        //4,创建map集合用来装载数据
        HashMap<String, Object> map = new HashMap<>();
        map.put("setmeal",setmealInDb);
        //5,设置静态页面生成位置和页面名称
         String outPutPathName=out_put_path+"mobile_setmeal_"+setmealInDb.getId()+".html";
        //1,调用静态化页面的方法
      HtmlStatic(templateName,map,outPutPathName);
        }
    }
    @Override
    public Setmeal findById(Integer id) {
        return setMealMapper.findById(id);
    }

    @Override
    public List<Integer> findSetMealCheckGroupById(Integer id) {
        return setMealMapper.findSetMealCheckGroupByIds(id);
    }

    @Override
    public void update(Integer[] ids, Setmeal setmeal) {
        //调用dao层根据id修改的方法
        setMealMapper.update(setmeal);
        //调用dao层根据套餐id删除套餐检查组中间表的方法(先解除该套餐和检查组的关系)
        setMealMapper.deleteSetMealCheckGroupById(setmeal.getId());
        //循环遍历检查组id
        for (Integer id : ids) {
            //调用dao层添加到套餐检查组中间表的方法(再添加该套餐和检查组新的关系)
            setMealMapper.addSetMealCheckGroup(setmeal.getId(),id);
        }
    }

    @Override
    public List<String> findAllImg() {
        return setMealMapper.findAllImg();
    }

    @Override
    public List<Setmeal> findAll() {
        return setMealMapper.findAll();
    }

    @Override
    public Setmeal findDetailById(Integer id) {
        return setMealMapper.findDetailById(id);
    }

    @Override
    public List<Map<String,Object>> findSetMealOrder() {
        return setMealMapper.findSetMealsOrder();
    }

    /*
    封装静态化页面的方法
     */
    //用@Autowired取出IOC容器中的对象
    @Autowired
    private FreeMarkerConfig freeMarkerConfigurer;
    //用@Value注解即可取出配置文件中的内容
    @Value("${out_put_path}")
    private  String out_put_path;
    //编写方法
    //templateName:模板名称
    //map:用来装载数据的集合
    //outPutPathName:指定静态页面生成位置
    public void HtmlStatic(String templateName, Map<String,Object> map,String outPutPathName){
        //1,获取配置类
        Configuration configuration = freeMarkerConfigurer.getConfiguration();
        BufferedWriter writer = null;
        try {
            //2,加载模板
            Template template = configuration.getTemplate(templateName);
            //3,map数据模型
            //4,页面输出位置 灰色代表可省略
             writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outPutPathName),"utf-8"));
            //5,将数据填充到模板
            template.process(map,writer);
            //6,刷新缓存流
            writer.flush();
        } catch (IOException | TemplateException e) {
            e.printStackTrace();
        }finally {
            //关闭流
            try {
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
